/**
 * @file 	ccMem32Disp.c
 * @brief  	实现物理地址转换虚拟地址，实现区间内容打印
 * 
 * @author 
 */
#include <vxWorks.h>
#include <stdlib.h>
#include <string.h>
#include <semLib.h>
#include <memLib.h>
#include <stdio.h>
#include <intLib.h>
#include <vxCpuLib.h>
#include <private/vmLibP.h>
#include <pmapLib.h>
#include <stdio.h>
#include <logLib.h>

 
/**
* md
* @brief 	读取指定物理地址指向的一段内容
* @param	physAddrhi  物理地址高位
* @param	physAddrlo	物理地址低位
* @param	len 	读取长度 
* @detail	由于32位系统无法在shell下传递超过32位的参数，所以物理地址分为两个参数传递
*/
void md(UINT8 physAddrhi,UINT32 physAddrlo,UINT32 len)
{
	int i;
	UINT32 mmuAttr;
	UINT32 *dmem;
	UINT64 physAddr = (((UINT64)physAddrhi <<32)) | (UINT64)physAddrlo ;
	mmuAttr = MMU_ATTR_VALID | MMU_ATTR_SUP_RW | MMU_ATTR_CACHE_OFF;	
	dmem=(UINT32*)pmapGlobalMap (physAddr,(size_t)len,mmuAttr);
#if 1
	printf("dmem     0x%08x%08x:\n",HIGH32((UINT64)dmem),LOW32((UINT64)dmem)); 
	printf("physAddr 0x%08x%08x:\n",HIGH32((UINT64)physAddr),LOW32((UINT64)physAddr)); 
#endif
	for(i=0;i<len/4;i=i+1)
	{
	  if(i%4==0)
			printf("\n0x%02x%08x: ",physAddrhi,(physAddrlo + i*4));
	  printf("0x%08x ",*(int *)(dmem + i));
	}
	printf("\n\n");
	pmapGlobalUnmap(dmem,len);
}
 

/**
* mm
* @brief 	修改指定物理地址指向的内容
* @param	physAddrhi  物理地址高位
* @param	physAddrlo	物理地址低位
* @param	data 	    写入的数据
* @detail	由于32位系统无法在shell下传递超过32位的参数，所以物理地址分为两个参数传递
*/
void mm(UINT8 physAddrhi,UINT32 physAddrlo,UINT32 data)
{

	UINT32 mmuAttr;
	UINT32 *dmem;
	UINT64 physAddr = (((UINT64)physAddrhi <<32)) | (UINT64)physAddrlo ;
	mmuAttr = MMU_ATTR_VALID | MMU_ATTR_SUP_RW | MMU_ATTR_CACHE_OFF;
	dmem=(UINT32*)pmapGlobalMap (physAddr,(size_t)0x400,mmuAttr);
	
	*(UINT32 *)dmem = data;
	 
	pmapGlobalUnmap(dmem,0x400);
}


/**
* marea
* @brief 	修改指定物理地址指向的区域
* @param	physAddrhi  起始物理地址高位
* @param	physAddrlo	起始物理地址低位
* @param	data 	    写入的数据
* @param	len 	    写入的长度
* @detail	由于32位系统无法在shell下传递超过32位的参数，所以物理地址分为两个参数传递
*/
void marea(UINT8 physAddrhi,UINT32 physAddrlo,UINT32 data, UINT32 len)
{

	UINT32 mmuAttr;
	UINT32 *dmem;
	int i;
	UINT64 physAddr = (((UINT64)physAddrhi <<32)) | (UINT64)physAddrlo ;
	mmuAttr = MMU_ATTR_VALID | MMU_ATTR_SUP_RW | MMU_ATTR_CACHE_OFF;
	dmem=(UINT32*)pmapGlobalMap (physAddr,(size_t)len,mmuAttr);
	
	
	for(i=0;i<len;i=i+1)
	{
		*(UINT8 *)((UINT32)dmem+i) = data;
			  
	}
	pmapGlobalUnmap(dmem,len);
}
